home *** CD-ROM | disk | FTP | other *** search
- MODULE AudioDemo; (* test of the AudioTool library module routines *)
- (* adapted to M2Amiga Modula-2 by Anthony Bryant *)
- FROM SYSTEM IMPORT
- ADR,ADDRESS,BYTE,FFP;
- FROM AudioTools IMPORT
- InitAudio, GetChannel, StopChannel, StartChannel,
- SetPV, SetWave, SetSamp, PlayNote, PlayFreq,
- MayGetNote, PlaySamp, CheckIfDone, FinishAudio;
- FROM Dos IMPORT
- Delay;
- FROM Exec IMPORT
- Byte, UByte, MsgPortPtr;
- FROM RandomNumber IMPORT
- RND;
- FROM Terminal IMPORT
- WriteLn, WriteString;
-
- TYPE
- waveArray = ARRAY [0..255] OF BYTE;
- CONST
- noiselen = 1024;
- VAR
- i: CARDINAL;
- channel, error, myid: LONGINT;
- myport: MsgPortPtr;
- sawtooth: waveArray;
- triangle: waveArray;
- square: waveArray;
- sinewave: waveArray;
- noise: ARRAY [0..noiselen-1] OF BYTE;
- noiseptr: ADDRESS;
-
- PROCEDURE MakeWaveArrays;
- VAR
- i: INTEGER; (* index to waveArray *)
- trv,sqv: Byte;
- sine,cosine,step: FFP; (* Fast Floating Point *)
- BEGIN
- trv:=0; sqv:=127;
- sine:=0.0; cosine:=1.0; step:=0.0247;
- FOR i:=0 TO 255 BY 1 DO
- sawtooth[i]:= Byte(127 - i);
- triangle[i]:= Byte(trv);
- square[i]:= Byte(sqv);
- sinewave[i]:= Byte(INTEGER(127.0 * sine));
- IF (i>62) AND (i<190) THEN DEC(trv,2); ELSE INC(trv,2); END;
- IF (i>127) THEN sqv:=-128; END;
- cosine:= cosine - (step * sine);
- sine:= sine + (step * cosine);
- END;
- END MakeWaveArrays;
-
- PROCEDURE MakeNoiseArray;
- VAR
- i: CARDINAL;
- BEGIN
- FOR i:=0 TO noiselen-1 BY 1 DO
- (* Use a PseudoRandom number generator to get white noise *)
- noise[i]:= Byte(127 - RND(256));
- END;
- noiseptr:= ADR(noise[0]);
- END MakeNoiseArray;
-
- BEGIN (* AudioDemo *)
- LOOP (* just once through, but with many EXITs *)
- WriteLn;
- WriteString("Demo of AudioTools. ");
- WriteLn;
- MakeWaveArrays; MakeNoiseArray;
- WriteLn;
- myport:= InitAudio(); (* save for MayGetNote and FinishAudio *)
- IF (myport = NIL) THEN WriteString("Problem in InitAudio!"); RETURN; END;
-
- FOR i:= 0 TO 3 BY 1 DO
- channel:= GetChannel(-1);
- IF (channel = -1) THEN WriteString("Cannot get a channel!"); EXIT; END;
- error:= StopChannel(channel);
- IF (error # 0) THEN WriteString("Error in stopping channel!"); EXIT; END;
- END;
- WriteString("Got & Stopped 4 channels O.K.");
- WriteLn;
-
- (* assign waveArrays using SetWave() *)
- (* SetWave(channel, wavearray) *)
- error:= SetWave(0, sawtooth);
- IF (error # 0) THEN WriteString("Error in SetWave, ch 0"); EXIT; END;
- error:= SetWave(1, triangle);
- IF (error # 0) THEN WriteString("Error in SetWave, ch 1"); EXIT; END;
- error:= SetWave(2, square);
- IF (error # 0) THEN WriteString("Error in SetWave, ch 2"); EXIT; END;
- error:= SetWave(3, sinewave);
- IF (error # 0) THEN WriteString("Error in SetWave, ch 3"); EXIT; END;
- WriteString("SetWave assigned all 4 waveforms.");
- WriteLn;
-
- (* PlayXXXX(channel, note/freq, vol, duration, priority,messageport, id) *)
- FOR i:= 0 TO 48 BY 1 DO (* all notes, 1/8 sec. *)
- PlayFreq(0, 10*i, 32, 125, 0, NIL, 0);
- PlayNote(1, 95-i, 32, 125, 0, NIL, 0);
- END;
- WriteString("Queued up Lo-Freq PlayNotes and PlayFreqs ");
- WriteLn;
-
- (* SMACK IN THE MIDDLE HERE, INSTALL TEST OF MESSAGING *)
- (* Make the note distinctive so we can tell for sure *)
-
- PlayNote(0, 3, 63, 500, 0, myport, 7);
- WriteString("Queued up Test of Messaging with id = 7");
- WriteLn;
- FOR i:= 50 TO 95 BY 1 DO (* all notes, 1/8 sec. *)
- PlayFreq(0, 10*i, 32, 125, 0, NIL, 0);
- PlayNote(1, 95-i, 32, 125, 0, NIL, 0);
- END;
- WriteString("Queued up Hi-Freq PlayNotes and PlayFreqs ");
- WriteLn;
-
- FOR i:= 0 TO 3 BY 1 DO
- error:= StartChannel(i);
- IF (error # 0) THEN WriteString("Error starting channel!"); EXIT; END;
- END;
- WriteString("Started all channels O.K.");
- WriteLn; WriteLn;
-
- WriteString("SLEEP now - the prioritized myid will wake me up.");
- WriteLn;
- myid:= MayGetNote(myport, TRUE); (* FALSE means don't sleep *)
- WriteLn;
- WriteString("Hey! Note I identified as ");
- IF (myid = 7) THEN WriteString("7"); ELSE WriteString("0"); END;
- WriteString(" just started to play");
- WriteLn; WriteLn;
-
- WriteString("Wait 6 seconds ... ");
- Delay(300);
- WriteString(" CheckIfDone ? - ");
- IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
- ELSE WriteString("TRUE"); END;
- WriteLn; WriteLn;
- WriteString("Now Queue up PlayNotes with duration > 2000.");
- WriteLn;
- PlayNote(0, 23, 32, 2000, 0, NIL, 0);
- PlayNote(1, 27, 32, 2300, 0, NIL, 0);
- PlayNote(2, 30, 32, 2600, 0, NIL, 0);
- PlayNote(3, 35, 32, 2900, 0, NIL, 0);
- WriteLn;
- Delay(150); (* Waits 3 seconds after letting the last note begin
- * (because last note is 2900/1000ths long).
- *)
- WriteString("Last note should have ended... ");
- WriteString("CheckIfDone ? - ");
- IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
- ELSE WriteString("TRUE"); END;
- WriteLn; WriteLn;
-
- (* assign noise array to ch 0, using SetSamp() *)
- (* SetSamp(channel, sampleaudio, length) *)
- error:= SetSamp(0, noiseptr, noiselen);
- IF (error # 0) THEN WriteString("Error in SetSamp, ch.0"); EXIT; END;
- WriteString("Finally, some noise, using PlaySamp");
- WriteLn;
- PlaySamp(0, 327, 48, 6000, 0, NIL, 0);
- (* PlaySamp(chan, samplrate, volume, 6.0sec duration, pri, msgpt, id) *)
-
- FOR i:= 6 TO 1 BY -1 DO (* try a 6 second decay of volume *)
- Delay(50);
- error:= SetPV(0,327, i*8);
- IF (error # 0) THEN WriteString("Error in SetPV, ch.0"); EXIT; END;
- END;
- (* If you take out this delay, you'll see that FinishAudio means
- * FINISH AUDIO... it cuts off the notes right in the middle if necessary! *)
- WriteString("Noise should have ended.");
- EXIT;
- END; (* LOOP *)
- WriteLn; WriteLn;
- WriteString("Ready to Finish Audio.");
- WriteLn;
- FinishAudio(myport);
- WriteString("Done!");
- WriteLn;
-
- END AudioDemo.mod
-